// * 回调中的回调（有时这些被称为“回调地狱”）
function fn(value, callback) {
	console.log(value) // 参数1 参数2 参数3
	callback(value)
}

fn('参数1', function (e) {
	console.log(e) // 参数1

	fn('参数2', function (e) {
		console.log(e) // 参数2

		fn('参数3', function (e) {
			console.log(e) // 参数3

			// ...
		})
	})
})

// ************************************************************************************************

// * 处理 Error
function loadScript(src, callback) {
	let script = document.createElement('script')
	script.src = src

	script.onload = () => callback(null, script)
	script.onerror = () => callback(new Error(`script load error: ${src}`))

	document.head.append(script)
}

// * 在 loadScript 中所使用的方案其实很普遍。它被称为“Error 优先回调（error-first callback）”风格。
// * 约定是：
// * callback 的第一个参数是为 error 而保留的。一旦出现 error，callback(err) 就会被调用。
// * 第二个参数（和下一个参数，如果需要的话）用于成功的结果。此时 callback(null, result1, result2…) 就会被调用。

loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js', function (error, script) {
	if (error) {
		// 处理错误
	} else {
		// 脚本加载成功
	}
})
